질문 응답 시스템
질문 응답 시스템
개요
질문 응답 시스템(Question Answering, QA)은 사용자가 자연어로 제시한 질문에 대해 정확하고 간결한 답변을 자동으로 생성하는 기술이다. 전통적인 정보 검색(IR) 시스템이 “문서 목록”을 반환한다면, QA 시스템은 “답변 자체”를 제공한다는 점에서 차별화된다. 최근 딥러닝, 특히 대규모 사전학습 언어 모델(Pre‑trained Language Models, PLM) 의 발전으로 다양한 도메인·언어에 적용 가능한 고성능 QA 시스템이 등장하고 있다.
본 문서는 질문 응답 시스템의 기본 개념, 주요 유형, 핵심 아키텍처, 데이터·평가 방법, 최신 연구 동향 및 구현 시 고려사항을 포괄적으로 정리한다.
1. 질문 응답 시스템의 종류
1.1 추출형(Extractive) QA
- 정의: 주어진 컨텍스트(문서, 패시지)에서 정답이 포함된 텍스트 조각을 직접 추출한다.
- 대표 모델: BERT‑based QA (e.g.,
bert-base-uncased), RoBERTa, ALBERT. - 특징
- 정답이 원문에 존재한다는 전제.
- 비교적 학습이 쉬우며, 정확도가 높은 편.
1.2 생성형(Generative) QA
- 정의: 질문과 컨텍스트를 입력으로 받아 새로운 문장을 생성한다.
- 대표 모델: T5, GPT‑3/4, BART, LLaMA.
- 특징
- 정답이 원문에 없거나 여러 문서를 종합해야 할 때 유용.
- “추론”·“요약” 능력이 필요해 모델 규모가 크다.
1.3 하이브리드(Hybrid) QA
- 정의: 추출·생성 과정을 순차적으로 결합하거나 동시 수행한다.
- 예시
- Retrieval‑augmented Generation (RAG): 먼저 문서 검색 → 추출된 문서 기반으로 생성.
- Fusion‑in‑Decoder: 검색된 문서 정보를 디코더에 직접 통합.
2. QA 시스템 아키텍처
┌─────────────────────┐
│ 사용자 질문 입력 │
└─────────┬───────────┘
│
┌──────▼───────┐
│ 전처리 (Tokenizer)│
└──────┬───────┘
│
┌──────▼───────┐
│ 검색/인덱스 │ ←· 문서·패시지·위키·DB 등
└──────┬───────┘
│
┌──────▼───────┐
│ 후보 문서 선정 │
└──────┬───────┘
│
┌──────▼───────┐
│ 답변 모델 (Extract/Generate) │
└──────┬───────┘
│
┌──────▼───────┐
│ 후처리·정렬 │
└──────┬───────┘
│
┌──────▼───────┐
│ 최종 답변 출력 │
└───────────────┘
2.1 전처리
- Tokenizer: WordPiece, SentencePiece 등으로 토큰화.
- 질문 정규화: 대소문자, 구두점, 불용어 처리(필요 시).
2.2 검색·인덱스
- BM25, DPR(Dense Passage Retrieval), FAISS 등 벡터 기반 검색 엔진 활용.
- 대규모 코퍼스(예: Wikipedia, 웹 크롤링 데이터)를 역인덱스 혹은 임베딩 인덱스에 저장.
2.3 후보 문서 선정
- 상위 k개의 문서를 리트리버가 반환하고, 이를 리랭커(Ranker)가 재정렬한다.
- 리랭커는 BERT‑based cross‑encoder 등으로 질문‑문서 쌍을 점수화한다.
2.4 답변 모델
| 유형 | 모델 예시 | 입력 | 출력 |
|---|---|---|---|
| 추출형 | BERT‑QA, SpanBERT | 질문 + 후보 문서 | 시작·끝 토큰 인덱스 |
| 생성형 | T5, GPT‑3 | 질문 + 후보 문서 | 자유 텍스트 |
| 하이브리드 | RAG, FiD | 질문 + 다수 후보 문서 | 생성 텍스트 (검색 정보 활용) |
2.5 후처리·정렬
- 스코어 기반 정렬: 추출형은 스팬 점수, 생성형은 로그 가능도(log‑prob).
- 중복 제거, 문맥 보강(예: 문장 연결) 등을 수행한다.
3. 데이터와 평가
3.1 주요 데이터셋
| 데이터셋 | 도메인 | 질문 유형 | 정답 형식 |
|---|---|---|---|
| SQuAD 1.1/2.0 | 위키피디아 | 사실형 | 추출형 스팬 |
| Natural Questions (NQ) | 구글 검색 | 사실·설명형 | 추출·생성 혼합 |
| HotpotQA | 다중 문서 | 복합·추론 | 추출·생성 |
| MS MARCO | 웹 문서 | 검색·QA | 추출·생성 |
| KORQuAD | 한국어 위키 | 사실형 | 추출형 |
| KorQuAD 2.0 | 한국어 위키 | 사실·비사실 | 추출·생성 |
3.2 평가 지표
- Exact Match (EM): 정답과 완전히 일치하는 경우 1점.
- F1 Score: 정답 토큰 집합과 예측 토큰 집합의 조화 평균.
- BLEU / ROUGE: 생성형 답변의 n‑gram 일치도.
- EMR (Exact Match Ratio) for Multi‑answer: 다중 정답 시 적용.
주의: 생성형 QA에서는 의미적 일치를 평가하기 위해 BERTScore, METEOR, GPT‑Eval 등 의미 기반 지표를 보조적으로 사용한다.
4. 최신 연구 동향
4.1 Retrieval‑Augmented Generation (RAG)
- 핵심 아이디어: 대규모 사전학습 언어 모델에 외부 지식(문서) 를 동적으로 제공한다.
- 구현: DPR 로 문서 검색 → BART/Seq2Seq 모델이 검색 결과를 디코더 입력 으로 사용.
4.2 멀티모달 QA
- 이미지·표·그래프 등 비텍스트 정보를 포함한 질문에 대응.
- 대표 모델: ViLT‑QA, LLaVA, Flamingo 등.
4.3 한국어 특화 QA
- KoBERT, KoELECTRA, KcBERT 기반 모델이 한국어 위키·뉴스·법령 데이터에 fine‑tuning.
- 한국어 고유의 어미·조사 처리와 형태소 분석이 성능에 큰 영향을 미친다.
4.4 지속 학습 & 도메인 적응
- Few‑Shot·Zero‑Shot 학습을 위한 Prompt Engineering 및 Instruction‑tuned 모델 활용.
- 도메인 별 Adapter(모듈형 파라미터) 삽입으로 메모리·연산 비용 절감.
5. 구현 시 고려사항
| 항목 | 설명 | 권장 방법 |
|---|---|---|
| 데이터 전처리 | 토큰화·정규화, 라벨 정제 | SentencePiece + KoNLPy |
| 검색 효율 | 대규모 코퍼스 → 실시간 검색 | FAISS + IVF‑PQ 인덱스 |
| 모델 크기 | GPU 메모리 제한 | DistilBERT, LoRA(Lo‑Rank Adaptation) |
| 답변 신뢰도 | Hallucination(허위 생성) 방지 | Retrieval‑Grounded, Answer‑Verification 모델 |
| 다국어·다도메인 | 언어·도메인 차이 | Multi‑Lingual BERT, Domain‑Specific Adapter |
| 서비스 배포 | latency·scalability | ONNX/TF‑Lite 변환, Kubernetes + Istio |
5.1 간단한 파이프라인 예시 (Python)
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
from faiss import IndexFlatIP
import torch
# 1) 모델 로드
tokenizer = AutoTokenizer.from_pretrained("klue/bert-base")
model = AutoModelForQuestionAnswering.from_pretrained("klue/bert-base")
# 2) 문서 임베딩 (예: BERT CLS)
def embed(texts):
inputs = tokenizer(texts, return_tensors="pt", truncation=True, padding=True)
with torch.no_grad():
embeddings = model.bert(**inputs).last_hidden_state[:,0,:] # CLS
return embeddings.cpu().numpy()
# 3) FAISS 인덱스 구축
corpus = ["문서1 내용...", "문서2 내용...", "..."]
embeds = embed(corpus)
index = IndexFlatIP(embeds.shape[1])
index.add(embeds)
# 4) 질문 처리 및 검색
question = "한국의 수도는 어디인가?"
q_emb = embed([question])
_, I = index.search(q_emb, k=5) # top‑5 문서
# 5) 추출형 QA 실행
candidate = corpus[I[0][0]]
inputs = tokenizer.encode_plus(question, candidate, return_tensors="pt")
outputs = model(**inputs)
start, end = torch.argmax(outputs.start_logits), torch.argmax(outputs.end_logits)
answer = tokenizer.decode(inputs["input_ids"][0][start:end+1])
print("답변:", answer)
위 코드는 간단한 추출형 QA 파이프라인을 구현한 예시이며, 실제 서비스에서는 배치 처리, GPU 가속, 오프라인 인덱스 업데이트 등을 추가한다.
6. 참고 자료 및 관련 문서
- 논문
- “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding” (Devlin et al., 2019)
- “Retrieval‑Augmented Generation for Knowledge‑Intensive NLP Tasks” (Lewis et al., 2020)
-
“KoBERT: Korean BERT Pretrained Model” (Kang et al., 2020)
-
오픈소스 프로젝트
- Haystack – 검색·QA 파이프라인 프레임워크
- RAG‑Implementation – DPR + RAG 모델 구현
-
KoQA – 한국어 QA 데이터셋 및 베이스라인
-
온라인 강좌·블로그
- “스탠포드 CS224N – 자연어 처리와 딥러닝” (강의 슬라이드)
- “파이토치로 구현하는 질문 응답 시스템” – TensorFlow/Keras 튜토리얼
결론
질문 응답 시스템은 검색과 언어 이해를 결합한 복합 AI 기술이며, 추출형·생성형·하이브리드 모델이 각각의 장·단점을 가지고 있다. 최신 연구는 지식 기반 검색과 대규모 생성 모델을 융합해 정확도와 범용성을 동시에 끌어올리는 방향으로 진행되고 있다. 실무에서는 데이터 전처리·인덱싱·모델 경량화·답변 검증 등 전반적인 파이프라인을 체계적으로 설계하는 것이 성공적인 QA 서비스 구현의 핵심이다.
이 문서는 AI 모델(gpt-oss-120b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.